package com.ruoyi.find.controller;

import cn.hutool.crypto.digest.DigestUtil;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileOutputStream;
import java.io.IOException;

import com.itextpdf.text.Image;

@RestController
@RequestMapping("contaract")
public class ContractController {

    // 定义一个GET请求接口，路径为"toHash"
    @GetMapping("toHash")
// 接口方法，接收名为"file"的文件参数，返回Object类型，可能抛出Exception
    public Object toHash(@RequestParam("file") MultipartFile file) throws Exception {
        // 验证文件是否为空：如果文件为null或内容为空
        if (file == null || file.isEmpty()) {
            // 抛出非法参数异常，提示"上传的文件不能为空"
            throw new IllegalArgumentException("上传的文件不能为空");
        }

        // 计算文件的MD5哈希值：通过文件输入流生成16进制哈希字符串
        String fileHash = DigestUtil.md5Hex(file.getInputStream());

        // 调用addPdf方法，传入上传的PDF文件进行处理
        addPdf(file);

        // 接口返回成功信息
        return "文件处理成功，副本已生成";
    }

    /**
     * 创建签名域。并且合并图片（方法注释）
     */
// addPdf方法：接收MultipartFile类型的PDF文件，可能抛出IO异常和文档处理异常
    public void addPdf(MultipartFile pdfFile) throws IOException, DocumentException {
        // 定义输出目录：固定为"D:\\电子合同专用\\"
        String outputDir = "D:\\电子合同专用\\";
        // 获取上传文件的原始文件名（如"验收单.pdf"）
        String originalFilename = pdfFile.getOriginalFilename();
        // 生成带印章的PDF路径：输出目录 + "副本_" + 原始文件名（如"D:\\电子合同专用\\副本_验收单.pdf"）
        String destPdf = outputDir + "副本_" + originalFilename;
        // 印章图片路径：输出目录下的"公司印章.png"
        String sealImgPath = outputDir + "公司印章.png";

        // 1. 读入原PDF：通过PdfReader解析上传文件的输入流
        PdfReader reader = new PdfReader(pdfFile.getInputStream());
        // 2. 输出新PDF：通过PdfStamper基于原PDF生成新文件，写入到destPdf路径
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destPdf));

        // 3. 获取画布：获取第一页的上层画布（内容会覆盖在原PDF之上）
        PdfContentByte over = stamper.getOverContent(1);

        // 4. 加载印章图片：读取sealImgPath路径的图片文件
        Image image = Image.getInstance(sealImgPath);
        // 设置图片大小为100×100像素
        image.scaleAbsolute(100, 100);
        // 设置图片在PDF中的位置：x=170（向右170像素），y=220（向上220像素，原点在左下角）
        image.setAbsolutePosition(170, 220);

        // 5. 绘制图片：将印章图片添加到画布上
        over.addImage(image);

        // 6. 关闭资源：先关闭PdfStamper，再关闭PdfReader（释放文件占用）
        stamper.close();
        reader.close();

        // 控制台打印新PDF的生成路径
        System.out.println("新PDF生成成功：" + destPdf);
    }


}
